
#include <iostream>
#include <string>
#include <memory>

// Step 1: 定义目标接口 (Target)
class Logger {
public:
    virtual ~Logger() = default;

    virtual void logInfo(const std::string& message) = 0;
    virtual void logError(const std::string& message) = 0;
};

// Step 2: 定义被适配类 (Adaptee)
class OldLogger {
public:
    void writeLog(const std::string& message) {
        std::cout << "[Old Log]: " << message << std::endl;
    }
};

// Step 3: 定义适配器类 (Adapter) - 适配旧日志系统到新的 Logger 接口
class LoggerAdapter : public Logger {
public:
    // 构造函数接受一个 OldLogger 对象的引用
    explicit LoggerAdapter(std::shared_ptr<OldLogger> oldLogger) : oldLogger_(oldLogger) {}

    // 实现 logInfo 方法
    void logInfo(const std::string& message) override {
        oldLogger_->writeLog("[INFO] " + message);
    }

    // 实现 logError 方法
    void logError(const std::string& message) override {
        oldLogger_->writeLog("[ERROR] " + message);
    }

private:
    std::shared_ptr<OldLogger> oldLogger_;  // 持有被适配类的指针，实现组合
};

// Step 4: 客户端代码，使用 Logger 接口
int main() {
    // 创建被适配类实例
    std::shared_ptr<OldLogger> oldLogger = std::make_shared<OldLogger>();

    // 使用适配器来适配旧日志系统
    std::unique_ptr<Logger> logger = std::make_unique<LoggerAdapter>(oldLogger);

    // 使用新接口记录日志
    logger->logInfo("Adapter pattern in action.");
    logger->logError("An error occurred.");

    return 0;
}




